package cn.file1;

import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Test02 {
    public static void main(String[] args) {
        // test01();
        // test02();
        // test03();
        // test05();
        // test06();
        test04();
    }

    /*
    练习4：删除多级文件夹
        需求： 如果我们要删除一个有内容的文件夹 1.先删除文件夹里面所有的内容 2.再删除自己
    * */
    private static void test04() {
        delAll(new File("move2"));
    }

    private static void delAll(File src) {
        File[] files = src.listFiles();
        if (files!= null) {
            for (File file : files) {
                if (file.isFile()) {
                    file.delete();
                } else {
                    delAll(file);
                }
            }
        }
        src.delete();
    }

    /*
    练习6：统计文件个数
        需求：统计一个文件夹中每种文件的个数并打印。（考虑子文件夹） 打印格式如下： txt:3个 doc:4个 jpg:6个
    * */
    private static void test06() {
        Map<String, Integer> count = getCount(new File("move"));
        count.forEach((key, value) -> System.out.println(key + ":" + value + "个"));
    }

    private static Map<String, Integer> getCount(File src) {
        Map<String, Integer> map = new HashMap<>();
        File[] files = src.listFiles();
        if (files != null) {
            for (File file : files) {
                if (file.isFile()){
                    String[] arr = file.getName().split("\\.");
                    if (arr.length >= 2){
                        String endName = arr[arr.length-1];
                        if (map.containsKey(endName)){
                            int c = map.get(endName);
                            c++;
                            map.put(endName,c);
                        }else{
                            map.put(endName,1);
                        }
                    }
                }else{
                    Map<String, Integer> count = getCount(file);
                    count.forEach((key, value) -> {
                        if (map.containsKey(key)) {
                            map.put(key, map.get(key) + value);
                        } else {
                            map.put(key, value);
                        }
                    });
                }
            }
        }
        return map;
    }



    /*
    练习5：统计大小
        需求：统计一个文件夹的总大小
    * */
    private static void test05() {
        long move = getFileSize(new File("move"));
        // System.out.println(new DecimalFormat("#.0").format(move/1024.0));
        System.out.printf("%.1f\n",move/1024.0);
    }

    private static long getFileSize(File src){
        long size = 0;
        File[] files = src.listFiles();
        if (files == null) {
            return 0;
        }
        for (File file : files) {
            if (file.isFile()){
                size += file.length();
            }else{
                size += getFileSize(file);
            }
        }
        return size;
    }

    /*
    练习3：（考虑子文件夹）
        找到电脑中所有以avi结尾的电影。（需要考虑子文件夹）
    * */
    private static void test03() {
        findAllAvi(new File("move"));
    }

    private static void findAllAvi(File src){
        File[] files = src.listFiles();
        if (files == null){
            return;
        }
        for (File file : files) {
            if (file.isFile() && file.getName().endsWith(".avi")){
                System.out.println(file);
            }else{
                findAllAvi(file);
            }
        }
    }

    /*
    练习2：查找文件（不考虑子文件夹）
        定义一个方法找某一个文件夹中，是否有以avi结尾的电影（暂时不需要考虑子文件夹）
    * */
    private static void test02() {
        File file = new File("move");
        File[] files = file.listFiles();
        if (files==null || files.length == 0){
            System.out.println("该文件夹为空");
            return;
        }
        List<File> list = Arrays.stream(files).filter(f -> f.getName().endsWith(".avi")).toList();
        System.out.println(list);
        List<String> list1 = Arrays.stream(files).map(File::getName).filter(name -> name.endsWith(".avi")).toList();
        System.out.println(list1);
    }

    /*
    综合练习
        练习1：创建文件夹
        在当前模块下的aaa文件夹中创建一个a.txt文件
    * */
    private static void test01(){
        // 需求：在当前模块下的aaa文件夹中创建一个a.txt文件
        File file = new File("aaa");
        boolean mkdir = file.mkdirs();
        System.out.println(mkdir);
        File file1 = new File(file, "aaa.log");
        try {
            boolean newFile = file1.createNewFile();
            System.out.println(newFile);
        } catch (IOException e) {
            System.out.println(e.getMessage());
        }
    }
}
